home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2006 December / PCWDEC06.iso / Software / Freeware / McAfee SiteAdvisor for Firefox 23.0 / safe.xpi / chrome / safe.jar / content / framework.js < prev    next >
Encoding:
JavaScript  |  2006-07-18  |  43.7 KB  |  1,311 lines

  1. /*-----------------------------------------------------
  2.   Copyright (c) 2006 McAfee, Inc.  All Rights Reserved.
  3.   -----------------------------------------------------*/
  4.  
  5. function SiteAdvisorFirefoxExtension() {
  6.  
  7. var on;
  8. var highliteon;
  9. var buttonon;
  10. var pagedom;
  11. var domain_specifier = "";
  12. var loc = "";
  13. var prodmode = true;
  14. var siteadvisor_debug = false;
  15. var siteadvisor_release = true;
  16. var on_search_page = "false";
  17. var byebye = false;
  18. var completejavascript = false;
  19. var alreadyWarned = false;
  20. var udscache = new Array();
  21. var cachesize = 50;
  22. var cachettl = 43200000;
  23. var regexmap = new Array();
  24. var req;
  25. var doSSL = false;
  26. var searchdat = "search.dat";
  27. var McLocales = new Array("en-US","en-CA","en-GB","en-AU","en-IE","es-ES","es-MX","es-AR","es-CL","es-PE",
  28.                           "fr-FR","fr-CA","pt-PT","pt-BR","de-DE","it-IT","ja-JP","nl-NL");
  29. var OEMStrB;
  30. var overlay_objects = new Array();
  31. var highlite_colors = new Array();
  32.  
  33. function putContents(rURL,lURL,build,cksum){
  34.   var contents = getContentsFromURL(rURL);
  35.   if (!contents) return;
  36.   tFile = "temp.js";
  37.   writeFile(contents,tFile);
  38.   if (validateCksum(tFile,cksum))
  39.       copyFile(tFile,lURL);
  40.   else
  41.       return;
  42.   if (build != -1) {
  43.       setBuild(build);
  44.   }
  45. }
  46.  
  47. function copyFile(src,dst) {
  48.    str = readFile(src);
  49.    writeFile(str,dst);
  50. }
  51.  
  52. function getContentsFromURL(rURL) {
  53.    try {
  54.       httpreq = new XMLHttpRequest();
  55.       httpreq.open('GET', rURL, false); 
  56.       httpreq.send(null);
  57.       if(httpreq.status == 200){
  58.          return httpreq.responseText;
  59.       }
  60.       else {
  61.          return null;
  62.       }
  63.    } catch (connerr) {
  64.       return null;
  65.    }
  66. }
  67.  
  68. function readFile(lURL) {
  69.   var file = Components.classes["@mozilla.org/file/directory_service;1"]
  70.                      .getService(Components.interfaces.nsIProperties)
  71.                      .get("ProfD", Components.interfaces.nsIFile);
  72.   file.append(lURL);
  73.   var data = "";
  74.   var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"]
  75.                         .createInstance(Components.interfaces.nsIFileInputStream);
  76.   var sstream = Components.classes["@mozilla.org/scriptableinputstream;1"]
  77.                         .createInstance(Components.interfaces.nsIScriptableInputStream);
  78.   fstream.init(file, 1, 0, false);
  79.   sstream.init(fstream); 
  80.   var str = sstream.read(-1);
  81.   while (str.length > 0) {
  82.     data += str;
  83.     str = sstream.read(-1);
  84.   }
  85.   sstream.close();
  86.   fstream.close();
  87.   return data;
  88. }
  89.  
  90. function writeFile(str,lURL) {
  91.   var file = Components.classes["@mozilla.org/file/directory_service;1"]
  92.                      .getService(Components.interfaces.nsIProperties)
  93.                      .get("ProfD", Components.interfaces.nsIFile);
  94.   file.append(lURL);
  95.   var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
  96.                          .createInstance(Components.interfaces.nsIFileOutputStream);
  97.   foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0); // write, create, truncate
  98.   foStream.write(str, str.length);
  99.   foStream.close();
  100. }
  101.  
  102. function validateCksum(lURL,cksum) {
  103.    var version = "0";
  104.    try {
  105.       var appInfo = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
  106.       version = appInfo.version;
  107.    } catch (appinfoerr) {
  108.       try {
  109.      version = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch).getCharPref("app.version");
  110.       } catch (preferr) {
  111.      return true; 
  112.       }
  113.    }
  114.    try {
  115.       var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"].getService(Components.interfaces.nsIVersionComparator);
  116.       if(versionChecker.compare(version, "1.5") < 0) return true;
  117.    } catch (vcheckerr) {
  118.       return true;  
  119.    }
  120.  
  121.    
  122.    var file = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);
  123.    file.append(lURL);
  124.    var hasher = Components.classes["@mozilla.org/security/hash;1"].createInstance(Components.interfaces.nsICryptoHash);
  125.    hasher.init(hasher.MD5);
  126.    var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"]
  127.                         .createInstance(Components.interfaces.nsIFileInputStream);
  128.    fstream.init(file, 1, 0, false);
  129.    hasher.updateFromStream(fstream,fstream.available());
  130.    if (hasher.finish(true) == base16To64(cksum))
  131.       return true;
  132.    if (cksum == "0123456789ABCDEF") return true;
  133.    return false;
  134. }
  135.  
  136. function base16To64(str16) {
  137.    var b64 = new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/');
  138.    var str64 = ""
  139.    while (str16.length > 0) {
  140.       str24 = str16.substring(0,6);
  141.       i24 = parseInt(str24,16);
  142.       if (str24.length == 6) {
  143.      str64 += b64[(i24&0xFC0000)>>18]+b64[(i24&0x3F000)>>12]+b64[(i24&0xFC0)>>6]+b64[i24&0x3F];
  144.       } else if (str24.length == 4) {
  145.      str64 += b64[(i24&0xFC00)>>10]+b64[(i24&0x3F0)>>4]+b64[(i24&0xF)<<2]+"=";
  146.       } else if (str24.length == 2) {
  147.      str64 += b64[(i24&0xFC)>>2]+b64[(i24&0x3)<<4] + "==";
  148.       }
  149.       str16 = str16.slice(6);
  150.    }
  151.    return str64;
  152. }
  153.  
  154. function addScript(lURL) {
  155.    try{
  156.       data = readFile(lURL);
  157.    } catch(e) {
  158.       return;
  159.    }
  160.  
  161.    try{
  162.       eval(data);
  163.    } catch(e) {}
  164.  
  165.    if (!completejavascript)
  166.       setBuild(0);
  167.  
  168.    if (getLKV() != 0 && parseFloat(getVersion()) > getLKV()) {
  169.     sendUpgradePing();
  170.     setLKV(getVersion());
  171.    } else if (getLKV() == 0) {
  172.         setLKV(getVersion());
  173.    }
  174.  
  175.    populate_menus();
  176.    setUpdateURL();
  177.    var appcon = window.document.getElementById("appcontent");
  178.  
  179.    if (appcon) {
  180.         appcon.addEventListener("DOMContentLoaded", save_me, false);    
  181.         appcon.addEventListener("focus",focus_handler,true);
  182.         appcon.addEventListener("blur",focus_handler,true);
  183.         appcon.addEventListener("mousedown",focus_handler,true);
  184.         appcon.addEventListener("mouseup",focus_handler,true);
  185.    }
  186.    changebutton();
  187. }
  188. function makeDssQuery(dssquery) {
  189.     var dssurl = getDss();
  190.     httpGetRequest(dssurl, dssquery, true, true,null,false);
  191. }
  192. function makeSSLDssQuery(dssquery) {
  193.         var dssurl = getDss();
  194.         httpGetRequest(dssurl, dssquery, true, true,null,true);
  195. }
  196.  
  197. function retryDssQuery(dssurl,dssquery,greq,forceSSL) {
  198.     if (dssurl.match(/dss1/)) dssurl = dssurl.replace("dss1","dss2");
  199.     else if (dssurl.match(/dss2/)) dssurl = dssurl.replace("dss2","dss1");    
  200.     setDss(dssurl);
  201.     httpGetRequest(dssurl, dssquery, false, false,greq,forceSSL);
  202. }
  203.  
  204. function useSSL(dssurl) {
  205.    if (dssurl.match(/^https:/)) return dssurl;
  206.    else return dssurl.replace(/^http:/,"https:");
  207. }
  208.    
  209.  
  210. function httpGetRequest(dssurl,dssquery,retry,timeout,oldreq,forceSSL) {
  211.  
  212.     if (oldreq) {
  213.         if (oldreq.timeoutId) clearTimeout(oldreq.timeoutId);
  214.         oldreq.onreadystatechange = null;
  215.         oldreq.abort();
  216.     }
  217.     var greq = new XMLHttpRequest();
  218.     if (timeout) {
  219.         greq.timeoutId = setTimeout(retryDssQuery,10000,dssurl,dssquery,greq,forceSSL);
  220.         greq.onprogress = function () {
  221.             clearTimeout(greq.timeoutId);
  222.             greq.timeoutId = setTimeout(retryDssQuery,10000,dssurl,dssquery,greq,forceSSL);
  223.         }
  224.     }
  225.         greq.open('GET',(forceSSL? useSSL(dssurl) : checkSSL(dssurl)) + dssquery, true);
  226.     greq.overrideMimeType('text/xml');
  227.     greq.setRequestHeader("Accept-Encoding", "");
  228.     greq.onreadystatechange = function () {
  229.         if (greq.readyState == 4) {
  230.             var stat;
  231.             try {stat = greq.status;}
  232.             catch(staterr) {stat = 500;}
  233.             if (greq.timeoutId) clearTimeout(greq.timeoutId);
  234.             if (stat == 200 && greq.responseXML.documentElement.nodeName != "parsererror") {
  235.                 DSSResponseHandler(greq.responseXML,dssquery);
  236.             } else if (retry) {
  237.                 retryDssQuery(dssurl,dssquery,greq,forceSSL);
  238.             } else {
  239.                 DSSFailureHandler(dssquery);
  240.             }
  241.         }
  242.     };
  243.     greq.send(null);
  244. }
  245.  
  246. function DSSResponseHandler(xml,dssquery) {
  247.     var responseHandlers = {'PingResponse': versionHandler,
  248.                     'DomainQueryResponse': SingleQueryDSSHandler};
  249.         var handlerFound = false;
  250.     for (var key in responseHandlers)
  251.         if (xml.getElementsByTagName(key).length == 1) {
  252.             responseHandlers[key](xml);
  253.                         handlerFound = true;
  254.         }
  255.         if (!handlerFound) {
  256.           checkForEmergency(xml);
  257.           DSSFailureHandler(dssquery);
  258.         }
  259. }
  260.  
  261. function DSSFailureHandler(dssquery) {
  262.     var responseHandlers = {'Ping?': pingFailureHandler,
  263.                     'Query?': function(){}};
  264.     for (var key in responseHandlers)
  265.         if (dssquery.indexOf(key) == 0)
  266.             responseHandlers[key]();
  267. }
  268. function pingFailureHandler() {
  269.     addScript(searchdat);
  270. }
  271.  
  272. function get_js() {
  273.     doSSL = getPref("bool","extensions.safe.doSSL",false);
  274.     makeSSLDssQuery("Ping?includeVersionInfo=true&version=2&client_ver=" + getFullVersion() +"&locale="+getLocale()+"&aff_id="+getAffid());
  275. }
  276.  
  277. function versionHandler(XML) {
  278.  
  279.     checkForEmergency(XML);
  280.  
  281.     var versioninfos = XML.getElementsByTagName("VersionInfo");
  282.  
  283.     for (var i = 0; i < versioninfos.length; i++) {
  284.         versioninfo = versioninfos.item(i);
  285.         entity = versioninfo.attributes.getNamedItem("entity").nodeValue;
  286.         
  287.         if (entity.toLowerCase() == searchdat) {
  288.             newestbuild = parseInt(versioninfo.attributes.getNamedItem("version").nodeValue);
  289.             currentbuild = getBuild();
  290.             if (newestbuild > currentbuild) {
  291.                 loca = versioninfo.attributes.getNamedItem("location").nodeValue;
  292.                     cksum = versioninfo.attributes.getNamedItem("cksum").nodeValue;
  293.                     var ioserv = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  294.                     var locaObj = ioserv.newURI(loca,"utf-8",null);
  295.                 if (locaObj.host.match(/\.siteadvisor\.com$/) || locaObj.host.match(/\.mcafee\.com$/) || locaObj.host.match(/^siteadvisor\.com$/) || locaObj.host.match(/^mcafee\.com$/))
  296.                     putContents(loca,searchdat,newestbuild,cksum);
  297.                 if (currentbuild != 0 && getBuild() > currentbuild)
  298.                     sendUpgradePing();
  299.                 immediate = versioninfo.attributes.getNamedItem("immediate").nodeValue;
  300.                 if (immediate == "true")
  301.                     check_auto_update();
  302.             }
  303.             
  304.             break;
  305.         }
  306.     }
  307.     addScript(searchdat);
  308. }
  309.  
  310. function getBuild() {
  311.  
  312.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  313.     try{
  314.         return pref.getIntPref("extensions.safe.build");
  315.     } catch(e) {
  316.         pref.setIntPref("extensions.safe.build",0);
  317.         return pref.getIntPref("extensions.safe.build");
  318.     }
  319.  
  320. }
  321.  
  322. function setBuild(build) {
  323.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  324.     pref.setIntPref("extensions.safe.build",build);
  325. }
  326.  
  327.  
  328. function populate_menus() {
  329.     ButtonPref = getPref("bool","extensions.safe.enablebutton",true);
  330.     onPref = getPref("bool","extensions.safe.on",true);
  331.     highlitePref = getPref("bool","extensions.safe.highlight",false);
  332.         doSSLPref = getPref("bool","extensions.safe.doSSL",false);
  333.  
  334.     on = onPref;
  335.     highliteon = highlitePref;
  336.     buttonon = ButtonPref;
  337.     doSSL = doSSLPref;
  338.  
  339.     if (!buttonon)
  340.         document.getElementById("SAFE-Combined-MoreInfo").setAttribute("disabled","true");
  341.  
  342.         
  343. }
  344.  
  345. function getPref(preftype, prefname, prefdef) {
  346.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  347.     try{
  348.         return pref.getBoolPref(prefname);
  349.     } catch(e) {    
  350.         pref.setBoolPref(prefname, prefdef);
  351.         return pref.getBoolPref(prefname);
  352.     }
  353. }
  354.  
  355. // LKV = last known version
  356. function getLKV() {
  357.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  358.     try{
  359.         return parseFloat(pref.getCharPref("extensions.safe.lastKnownVersion"));
  360.     } catch(e) {
  361.         pref.setCharPref("extensions.safe.lastKnownVersion","0");
  362.         return parseFloat(pref.getCharPref("extensions.safe.lastKnownVersion"));
  363.     } 
  364. }
  365.  
  366. function setLKV(lkv) {
  367.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  368.     pref.setCharPref("extensions.safe.lastKnownVersion",lkv);
  369. }
  370.  
  371. function getFullVersion() {
  372.     var client_version  = "FF_unknown";
  373.     try {
  374.         client_version = "FF_" + getVersion();
  375.         client_version += "_" + getBuild();
  376.     } catch (versionerr) {}
  377.     return client_version;
  378. }
  379.  
  380. function checkSSL(dssurl) {
  381.    if (dssurl.match(/^https:/)) return dssurl;
  382.    if (doSSL)
  383.       return dssurl.replace(/^http:/,"https:");
  384.    else return dssurl;
  385. }
  386.  
  387. function sendUpgradePing() {
  388.     try{
  389.         var request = new XMLHttpRequest();
  390.             request.open("GET", checkSSL(getDss()) + "Ping?Version=2&Type=upgrade&client_type=SAFE&client_ver=" +getFullVersion()+"&locale="+getLocale()+"&aff_id="+getAffid(), true);    
  391.             request.send(null);    
  392.     } catch(comerr) {}
  393. }
  394.  
  395. // see if its time to send a ping and send if necessary
  396. function pingDSS() {
  397.  
  398.     // get last daily and monthly from prefs (in string millisecond format)
  399.     var lastDaily = getLastDailyPing();
  400.     var lastMonthly = getLastMonthlyPing();
  401.  
  402.     // convert string dates into Date objects
  403.     var lastDailyDate = new Date(lastDaily);     
  404.     var lastMonthlyDate = new Date(lastMonthly); 
  405.  
  406.     // get the "next month" and "next day" in milliseconds
  407.     var nextMonth = lastMonthlyDate.setUTCMonth(lastMonthlyDate.getUTCMonth()+1);
  408.     var nextDay = lastDailyDate.setUTCDate(lastDailyDate.getUTCDate()+1);
  409.     
  410.     // get "right now" in milliseconds
  411.     var rightNowDate = new Date();
  412.     var rightNow = rightNowDate.getTime();
  413.  
  414.     // if a month has passed, send a monthly    
  415.     if (nextMonth < rightNow) {
  416.  
  417.         // try to send monthly        
  418.                try {
  419.                   request = new XMLHttpRequest();
  420.                   request.open("GET", checkSSL(getDss()) + "Ping?Version=2&Type=monthly&client_type=SAFE&client_ver=" + getFullVersion()+"&locale="+getLocale(), false);
  421.                   request.overrideMimeType('text/xml');
  422.                   request.setRequestHeader("Accept-Encoding", "");
  423.                   request.send(null);
  424.                   var stat;
  425.           try {stat = request.status;}
  426.                   catch(staterr) {stat = 500;}
  427.                   if (stat != 200 || request.responseXML.documentElement.nodeName == "parsererror") return;
  428.                   if (request.responseXML.getElementsByTagName("PingResponse").length == 0) return;
  429.                 } catch(pingreqerr) {
  430.                   return; 
  431.                 }
  432.                 
  433.                 // update last daily to NOW
  434.         rightNowDate.setUTCHours(0);
  435.         rightNowDate.setUTCMinutes(0);
  436.         rightNowDate.setUTCSeconds(0);
  437.         rightNow = rightNowDate.getTime();
  438.         setLastDailyPing(rightNow);
  439.  
  440.         // update last monthly to 1st of month        
  441.         rightNowDate.setUTCDate(1);
  442.         rightNow = rightNowDate.getTime();
  443.         setLastMonthlyPing(rightNow);
  444.  
  445.     // otherwise, if a day has passed, send a daily
  446.     } else if (nextDay < rightNow) {
  447.  
  448.         // try to send daily
  449.                 try {
  450.                   request = new XMLHttpRequest();
  451.                   request.open("GET", checkSSL(getDss()) + "Ping?Version=2&Type=daily&client_type=SAFE&client_ver=" + getFullVersion()+"&locale="+getLocale()+"&aff_id="+getAffid(), false);
  452.                   request.overrideMimeType('text/xml');
  453.                   request.setRequestHeader("Accept-Encoding", "");
  454.                   request.send(null);
  455.                   var stat;
  456.           try {stat = request.status;}
  457.                   catch(staterr) {stat = 500;}
  458.                   if (stat != 200 || request.responseXML.documentElement.nodeName == "parsererror") return;
  459.                   if (request.responseXML.getElementsByTagName("PingResponse").length == 0) return;
  460.                 } catch(pingreqerr) {
  461.                   return; 
  462.                 }
  463.                 
  464.         // update last daily to NOW
  465.         rightNowDate.setUTCHours(0);
  466.         rightNowDate.setUTCMinutes(0);
  467.         rightNowDate.setUTCSeconds(0);
  468.         rightNow = rightNowDate.getTime();
  469.         setLastDailyPing(rightNow);
  470.     }
  471.  
  472. }
  473.  
  474. function getLocale() {
  475.   try {
  476.     var ffLocale = navigator.language;
  477.     var langPart = ffLocale.split("-")[0];
  478.     var langMatch;
  479.     for (var l = 0; l < McLocales.length; l++) {
  480.       if (McLocales[l] == ffLocale) return ffLocale;
  481.       if (!langMatch && McLocales[l].split("-")[0] == langPart) langMatch = McLocales[l];
  482.     }
  483.     return langMatch ? langMatch : "en-US";
  484.   } catch(e) {
  485.     return "en-US";
  486.   }
  487. }
  488.  
  489. function getDss() {
  490.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  491.     try{
  492.         return pref.getCharPref("extensions.safe.dss");
  493.     } catch(e) {
  494.     
  495.         pref.setCharPref("extensions.safe.dss","http://dss1.siteadvisor.com/DSS/");
  496.     
  497.         return pref.getCharPref("extensions.safe.dss");
  498.     }
  499.  
  500. }
  501.  
  502. function setDss(dss) {
  503.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  504.     pref.setCharPref("extensions.safe.dss",dss);
  505. }
  506.  
  507. function getLastDailyPing() {
  508.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  509.     try{
  510.         return parseFloat(pref.getCharPref("extensions.safe.lastDailyPing"));
  511.     } catch(e) {
  512.         pref.setCharPref("extensions.safe.lastDailyPing","0");
  513.         return parseFloat(pref.getCharPref("extensions.safe.lastDailyPing"));
  514.     }
  515.  
  516. }
  517.  
  518. function setLastDailyPing(t) {
  519.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  520.     pref.setCharPref("extensions.safe.lastDailyPing",t.toString());
  521. }
  522.  
  523. function getLastMonthlyPing() {
  524.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  525.     try{
  526.         return parseFloat(pref.getCharPref("extensions.safe.lastMonthlyPing"));
  527.     } catch(e) {
  528.         pref.setCharPref("extensions.safe.lastMonthlyPing","0");
  529.         return parseFloat(pref.getCharPref("extensions.safe.lastMonthlyPing"));
  530.     }
  531.  
  532. }
  533.  
  534. function setLastMonthlyPing(t) {
  535.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  536.     pref.setCharPref("extensions.safe.lastMonthlyPing",t.toString());
  537. }
  538.  
  539.  
  540. function check_auto_update() {
  541.  
  542.     if (!( getPref("bool", "extensions.safe.enablebutton", true) || getPref("bool", "extensions.safe.on", true) || getPref("bool", "extensions.safe.highlight", false)))
  543.         return;
  544.     
  545.     var areq = new XMLHttpRequest();
  546.     
  547.     areq.open('GET',"https://sadownload.mcafee.com/products/sa/firefox/update.rdf", true);
  548.     
  549.     areq.overrideMimeType('text/plain');
  550.     areq.onreadystatechange = function () {
  551.         try{
  552.         if (areq.readyState == 4) {
  553.             var stat;
  554.             try {
  555.                 stat = areq.status;
  556.             } catch (staterr) {
  557.                 stat = 500;
  558.             }
  559.             if (stat == 200){
  560.                 resp = areq.responseText;
  561.                 
  562.                 start = resp.indexOf("<version>");
  563.                 end = resp.indexOf("</version>");
  564.                 newest_version = parseFloat(resp.substring(start+9,end));
  565.  
  566.                 var VERSION = parseFloat(getVersion());
  567.                 // check if the server has a newer version
  568.                 if (newest_version > VERSION) {                
  569.                     var install = confirm(strb("safe.updateRequiredResponse"));
  570.                     if (install) {
  571.                         // Extension force-Auto-update code
  572.                         var nsIUpdateItem = Components.interfaces.nsIUpdateItem;
  573.                         var gExtensionManager = Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager);
  574.                         var itemType=nsIUpdateItem.TYPE_EXTENSION;
  575.                         var items;
  576.                         try{
  577.                             items = gExtensionManager.getItemList('{1650a312-02bc-40ee-977e-83f158701739}', itemType, { });
  578.                             var updates = Components.classes["@mozilla.org/updates/update-service;1"].getService(Components.interfaces.nsIUpdateService);
  579.                             updates.checkForUpdates(items, items.length, itemType, Components.interfaces.nsIUpdateService.SOURCE_EVENT_USER, window);
  580.  
  581.                         } catch(ve) {
  582.                             // Firefox 1.5 makes this tons of fun... 
  583.  
  584.                             item = gExtensionManager.getItemForID('{1650a312-02bc-40ee-977e-83f158701739}');
  585.                             items = new Array();
  586.                             items[0] = item;
  587.                             updateListener = new Object();
  588.                             updateListener.onUpdateStarted = function() {};
  589.                             updateListener.onUpdateEnded = function() {};
  590.                             updateListener.onAddonUpdateStarted = function(addon) {};
  591.                             updateListener.onAddonUpdateEnded = function(addon,status) {
  592.                                 if (status == 1) {
  593.                                     var xpimgr = Components.classes["@mozilla.org/xpinstall/install-manager;1"].createInstance(Components.interfaces.nsIXPInstallManager);
  594.                                     urls = new Array();
  595.                                     urls[0] = addon.xpiURL;
  596.                                     progress = new Object();
  597.                                     progress.onStateChange = function(idx,st,val) {
  598.                                         if (st == Components.interfaces.nsIXPIProgressDialog.INSTALL_DONE) {
  599.                                            restart = confirm(strb("safe.closeFFRequest"));
  600.                                            if (restart) {
  601.                                             var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
  602.                                             var enumerator = wm.getEnumerator("");
  603.                                             while(enumerator.hasMoreElements()) {
  604.                                                 var win = enumerator.getNext();
  605.                                                 win.close();
  606.                                             }
  607.                                            }
  608.                                         }
  609.                                     }
  610.                                     progress.onProgress = function(idx,val,mval) {}
  611.                                     xpimgr.initManagerFromChrome(urls,1,progress);
  612.  
  613.                                 }
  614.                             };                        
  615.                             gExtensionManager.update(items,1,false,updateListener);
  616.                             
  617.                             
  618.                             
  619.                         }
  620.                     }
  621.                     else
  622.                         alert(strb("safe.turnOffSafe"));                
  623.                 }
  624.             }
  625.         }
  626.         } catch(e) {}
  627.     };
  628.     areq.send(null);
  629.  
  630.  
  631.  
  632. }
  633.  
  634. function getVersion() {
  635.     try{
  636.     
  637.     var RDFServ = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
  638.     var versionRDF = RDFServ.GetResource("http://www.mozilla.org/2004/em-rdf#version");
  639.     var extension_data_source= Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager).datasource;
  640.  
  641.  
  642.     var nameArc = RDFServ.GetResource("http://www.mozilla.org/2004/em-rdf#name");
  643.     var Container = Components.classes["@mozilla.org/rdf/container;1"].getService(Components.interfaces.nsIRDFContainer);
  644.     try {
  645.         var root = RDFServ.GetResource("urn:mozilla:item:root");
  646.         Container.Init(extension_data_source,root);
  647.     } catch(e) {
  648.         var root = RDFServ.GetResource("urn:mozilla:extension:root");
  649.         Container.Init(extension_data_source,root);
  650.     
  651.     }
  652.     var elements=Container.GetElements();
  653.     while (elements.hasMoreElements()) {
  654.         var element = elements.getNext().QueryInterface(Components.interfaces.nsIRDFResource);                
  655.             var target = extension_data_source.GetTarget(element, nameArc ,true);
  656.         if (target) {
  657.             name = target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  658.             if (name == "McAfee SiteAdvisor")
  659.                 return extension_data_source.GetTarget(element, versionRDF, true).QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  660.         }
  661.     }
  662.     return strb("safe.unknownVersion");
  663.     } catch (allerr) {
  664.     return strb("safe.unknownVersion");
  665.     }
  666. }
  667.  
  668.  
  669. function stripargs(loc) {
  670.     
  671.     i = loc.indexOf("?")
  672.     if (i != -1)
  673.         loc = loc.substring(0,i);
  674.     i = loc.indexOf("&")
  675.     if (i != -1)
  676.         loc = loc.substring(0,i);
  677.     i = loc.indexOf(";")
  678.     if (i != -1)
  679.         loc = loc.substring(0,i);
  680.     i = loc.indexOf(",")
  681.     if (i != -1)
  682.         loc = loc.substring(0,i);
  683.     i = loc.indexOf("'")
  684.     if (i != -1)
  685.         loc = loc.substring(0,i);
  686.     i = loc.indexOf(" ")
  687.     if (i != -1)
  688.         loc = loc.substring(0,i);
  689.     return loc;
  690. }
  691.  
  692.  
  693.  
  694. function addToCache(uds,verdict,color,regxp) {
  695.  
  696.     newregxp = "";
  697.     for (var c = 0; c < regxp.length; c++) {
  698.         if (regxp[c] == "}")
  699.             newregxp += ")";
  700.         else if (regxp[c] == "{")
  701.             newregxp += "(?:";
  702.         else if (regxp[c] == "/")
  703.             newregxp += "\\/";
  704.         else newregxp += regxp[c];
  705.     }    
  706.  
  707.     newEntry = new Object();
  708.     newEntry["ds"] = uds;
  709.     newEntry["vd"] = verdict;
  710.     newEntry["ts"] = (new Date()).getTime();
  711.     newEntry["its"] = (new Date()).getTime();
  712.     newEntry["co"] = color;
  713.  
  714.     regexmap[regexmap.length] = newregxp;
  715.  
  716.  
  717.     if (udscache.length >= cachesize) {
  718.         min = 0
  719.         for (var i = 1; i < udscache.length; i++) {
  720.             if (udscache[i]["its"] + cachettl < (new Date()).getTime()) {
  721.                 min = i;
  722.                 break;
  723.             }    
  724.             if (udscache[i]["ts"] < udscache[min]["ts"])
  725.                 min = i
  726.         }
  727.  
  728.         udscache[min] = newEntry;
  729.  
  730.     } else {
  731.         udscache[udscache.length] = newEntry;
  732.  
  733.     }
  734. }
  735.  
  736. function getFromCache(mURL) {
  737.     
  738.     var dsfrommap = getDsFromMap(mURL);
  739.     if (!dsfrommap)
  740.         return false;
  741.     var entryfromcache = getEntryFromCache(dsfrommap);
  742.     if (!entryfromcache)
  743.         return false;
  744.     return entryfromcache;
  745.  
  746. }
  747.  
  748. function getDsFromMap(mURL) {
  749.  
  750.  
  751.     for (var i = 0; i < regexmap.length; i++) {
  752.         regxp = regexmap[i];
  753.         regxps = regxp.split(/\s/);
  754.         
  755.         for (var r = 0; r < regxps.length; r++) {
  756.             try{
  757.               eval("var rem = mURL.match(/" + regxps[r] + "/);");
  758.               if (rem) {
  759.                 return rem[rem.length-1];
  760.               }
  761.             } catch (rexe) {}
  762.         }
  763.     }
  764.  
  765.     return false;
  766. }
  767.  
  768. function getEntryFromCache(ds) {
  769.  
  770.     for (var i = 0; i < udscache.length; i++) {
  771.         if (udscache[i]["ds"] == ds) {
  772.  
  773.             if (udscache[i]["its"] + cachettl < (new Date()).getTime())
  774.                 continue;
  775.             else
  776.                 return udscache[i];
  777.         }
  778.     }
  779.     return false;
  780. }
  781.  
  782. function updateCache(cacheEntry) {
  783.     cacheEntry["ts"] = (new Date()).getTime();
  784. }
  785.  
  786.  
  787. function bad_host(h) {
  788.     
  789.     if (h == ""              || 
  790.         h.match(/[^a-z0-9\.\-]/)    ||
  791.             h == "localhost"     ||
  792.             h == "127.0.0.1"     || 
  793.             (h.indexOf(".") == -1 && !h.match(/^\d+$/)) || 
  794.             h.indexOf(".") == 0  ||
  795.         h.match(/^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) ||
  796.         h.match(/^172\.(1[6-9]|2[0-9]|3[0-1])\.\d{1,3}\.\d{1,3}$/) ||
  797.         h.match(/^192\.168\.\d{1,3}\.\d{1,3}$/) ||
  798.         h.match(/\.localdomain$/) ||
  799.             h.match(/\.local$/))  {
  800.         return true;
  801.         }
  802.     return false;
  803. }
  804.  
  805. function bad_protocol(p) {
  806.     
  807.     if (p.indexOf("http:") == 0      || 
  808.             p.indexOf("https:") == 0     ||
  809.             p.indexOf("ftp:") == 0)
  810.         return false;
  811.     
  812.     return true;
  813. }
  814.  
  815.  
  816. function changebutton() {
  817.     
  818.     try{
  819.         if (!buttonon) {
  820.             document.getElementById("SAFE-TB-Combined").setAttribute("image","chrome://safe/content/safe.gif");
  821.             return;
  822.         }
  823.  
  824.  
  825.         domain_specifier = "";
  826.         loc = window._content.location.href;
  827.  
  828.  
  829.         document.getElementById("SAFE-TB-Combined").setAttribute("image","chrome://safe/content/safe.gif");
  830.         var h = "";
  831.         var p = "";
  832.         var pn = "";
  833.         try{ 
  834.             h = window._content.location.host.toLowerCase();
  835.             portsplit = h.split(":");
  836.             if (portsplit.length == 2)
  837.                 h = portsplit[0];
  838.             p = window._content.location.protocol.toLowerCase();
  839.             pn = window._content.location.pathname;
  840.         } catch(he) {return;}
  841.  
  842.         if (bad_host(h))
  843.             return;
  844.         if (bad_protocol(p))
  845.             return;
  846.  
  847.         sloc = stripargs(h + pn);
  848.         cacheEntry = getFromCache(sloc);
  849.         if (cacheEntry) {
  850.             domain_specifier = cacheEntry["ds"];
  851.             if (cacheEntry["vd"].toLowerCase() == "unknown")
  852.                 document.getElementById("SAFE-TB-Combined").setAttribute("image","chrome://safe/content/safe.gif");
  853.             else 
  854.                 document.getElementById("SAFE-TB-Combined").setAttribute("image","chrome://safe/content/safe-" + cacheEntry["co"].toLowerCase() + ".gif");
  855.             
  856.             updateCache(cacheEntry);
  857.             return;
  858.  
  859.         }
  860.  
  861.         makeDssQuery("Query?Entitlement=FOO&Type=domain&version=2&name="+escape(sloc)+"&client_ver="+getFullVersion()+"&locale="+getLocale()+"&aff_id="+getAffid());
  862.     } catch(e) {}
  863. }
  864.  
  865.  
  866. function SingleQueryDSSHandler(XML) {
  867.  
  868.     checkForEmergency(XML);
  869.  
  870.     var domaininfo = XML.getElementsByTagName("DomainInfo");
  871.     if (!domaininfo || !domaininfo.item(0)) {
  872.         return;
  873.     }
  874.  
  875.     domain_specifier = domaininfo.item(0).attributes.getNamedItem("name").nodeValue;
  876.     var dmd = XML.getElementsByTagName("DomainMetaData");
  877.     var regxp;
  878.     if (dmd) {
  879.         regxp = dmd.item(0).attributes.getNamedItem("domainSpecRegExs").nodeValue;
  880.     } else {
  881.         regxp = "REGEXNOTFOUND";
  882.     }
  883.  
  884.     infochildren = domaininfo.item(0).childNodes;
  885.     for (var i = 0; i < infochildren.length; i++) {
  886.         if (infochildren.item(i).nodeName.toLowerCase() == "classification") {
  887.             if (infochildren.item(i).attributes.getNamedItem("code").nodeValue.toLowerCase() == "unknown")
  888.                 document.getElementById("SAFE-TB-Combined").setAttribute("image","chrome://safe/content/safe.gif");
  889.             else 
  890.                 document.getElementById("SAFE-TB-Combined").setAttribute("image","chrome://safe/content/safe-" + infochildren.item(i).attributes.getNamedItem("color").nodeValue.toLowerCase() + ".gif");
  891.             
  892.             addToCache(domain_specifier,infochildren.item(i).attributes.getNamedItem("code").nodeValue,infochildren.item(i).attributes.getNamedItem("color").nodeValue,regxp);
  893.             break;    
  894.         }
  895.     }
  896.         
  897.         pingDSS();
  898.     
  899.  
  900. }
  901.  
  902.  
  903. function focus_handler(e) {
  904.  
  905.     if (e.originalTarget.nodeName == "#document" || e.originalTarget.nodeName == "tab" || e.originalTarget.nodeName == "xul:tab") {
  906.         docloc = window._content.document.location.href;
  907.         if (docloc != loc) {
  908.             changebutton();
  909.         }
  910.     }
  911.  
  912. }
  913.  
  914. function openSettings() {
  915.     var params = {ok:false};
  916.  
  917.     window.openDialog('chrome://safe/content/settings.xul','safe-settings','chrome,modal',params);
  918.     populate_menus();
  919.     nav_href = window._content.document.location.href;
  920.     if (!buttonon) { 
  921.         document.getElementById("SAFE-TB-Combined").setAttribute("image","chrome://safe/content/safe.gif");
  922.         document.getElementById("SAFE-Combined-MoreInfo").setAttribute("disabled","true");
  923.     } else {
  924.         changebutton();
  925.         document.getElementById("SAFE-Combined-MoreInfo").setAttribute("disabled","false");
  926.     }
  927.     if (params.ok && eval(on_search_page) == true) {
  928.         window._content.location.reload();
  929.     }
  930.         doSSL = getPref("bool","extensions.safe.doSSL",false);
  931. }
  932.  
  933. function postInstallCheck() {
  934.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  935.     var firstInstall = false;
  936.     try{
  937.         firstInstall =  pref.getBoolPref("extensions.safe.firstinstall");
  938.     } catch(e) {
  939.         pref.setBoolPref("extensions.safe.firstinstall",true);
  940.         firstInstall =  pref.getBoolPref("extensions.safe.firstinstall");
  941.     }
  942.  
  943.     if (firstInstall) {
  944.         var params = {ok:false};
  945.         pref.setBoolPref("extensions.safe.firstinstall",false);    
  946.         window.openDialog('chrome://safe/content/disclosure.xul','safe-disclosure','chrome,modal',params);
  947.         if (params.ok) {
  948.             try {
  949.                 window._content.location.href = "http://www.siteadvisor.com/download/ff_postinstall.html?aff_id="+getAffid();
  950.                        var irequest = new XMLHttpRequest();
  951.                 var pingquery = checkSSL(getDss()) + "Ping?Version=2&Type=install&client_type=SAFE&client_ver=" + getFullVersion() + "&locale="+getLocale()+"&aff_id="+getAffid();
  952.                     irequest.open("GET", pingquery, true);
  953.                     irequest.send(null);        
  954.             } catch (comerr) {}
  955.             addSASearch();
  956.             
  957.                 
  958.         } else {
  959.             pref.setBoolPref("extensions.safe.firstinstall",true);
  960.             var gExtensionManager = Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager);
  961.             try {
  962.                 gExtensionManager.uninstallItem("{1650a312-02bc-40ee-977e-83f158701739}");
  963.             } catch (e) {
  964.                 ds = gExtensionManager.datasource;
  965.                 gExtensionManager.uninstallExtension("{1650a312-02bc-40ee-977e-83f158701739}");
  966.             }
  967.             window.openDialog('chrome://safe/content/uninst.xul','safe-uninst','chrome,modal');
  968.  
  969.         }
  970.         
  971.     }
  972.     
  973. }
  974.  
  975. function removeInstallRegKey() {
  976.   try {
  977.     var regKey = Components.classes["@mozilla.org/windows-registry-key;1"].createInstance(Components.interfaces.nsIWindowsRegKey);
  978.     regKey.open(Components.interfaces.nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE, "SOFTWARE\\Mozilla\\Firefox\\Extensions", Components.interfaces.nsIWindowsRegKey.ACCESS_WRITE);
  979.     regKey.removeValue("{1650a312-02bc-40ee-977e-83f158701739}");
  980.   } catch (RegErr) {}
  981. }
  982.  
  983. function cleanup() {
  984.  
  985.     if (byebye == true) {
  986.     var pingquery = checkSSL(getDss()) + "Ping?Version=2&Type=uninstall&client_type=SAFE&client_ver=" + getFullVersion()+"&locale="+getLocale()+"&aff_id="+getAffid();
  987.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  988.     pref.clearUserPref("extensions.safe.build");
  989.     pref.clearUserPref("extensions.safe.dss");
  990.     pref.clearUserPref("extensions.safe.firstinstall");
  991.     pref.clearUserPref("extensions.safe.highlight");
  992.     pref.clearUserPref("extensions.safe.lastDailyPing");
  993.     pref.clearUserPref("extensions.safe.lastMonthlyPing");
  994.     pref.clearUserPref("extensions.safe.on");
  995.     pref.clearUserPref("extensions.safe.enablebutton");
  996.     pref.clearUserPref("extensions.safe.lastKnownVersion");
  997.         pref.clearUserPref("extensions.safe.doSSL");
  998.     removeSASearch();
  999.     removeInstallRegKey();
  1000.     try{
  1001.                var irequest = new XMLHttpRequest();
  1002.             irequest.open("GET", pingquery, false);
  1003.         irequest.send(null);    
  1004.     } catch (reqerr) {}
  1005.     return;
  1006.     }
  1007.  
  1008.     var RDFService = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
  1009.     var Container = Components.classes["@mozilla.org/rdf/container;1"].getService(Components.interfaces.nsIRDFContainer);
  1010.     var extensionDS= Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager).datasource;
  1011.     try {    
  1012.         var root = RDFService.GetResource("urn:mozilla:item:root");
  1013.     Container.Init(extensionDS,root);
  1014.     } catch (e) {
  1015.     var root = RDFService.GetResource("urn:mozilla:extension:root");
  1016.     Container.Init(extensionDS,root);
  1017.     }
  1018.     var nameArc = RDFService.GetResource("http://www.mozilla.org/2004/em-rdf#name");
  1019.     var toBeUninstalledArc = RDFService.GetResource("http://www.mozilla.org/2004/em-rdf#toBeUninstalled");
  1020.  
  1021.     var found = false;
  1022.     var elements = Container.GetElements();
  1023.     while (elements.hasMoreElements()) {
  1024.         var element = elements.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  1025.         var name;
  1026.         var toBeUninstalled;
  1027.     
  1028.         var target = extensionDS.GetTarget(element, nameArc ,true);
  1029.         if (target) {
  1030.             name = target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  1031.  
  1032.         if (name == "McAfee SiteAdvisor") {
  1033.             target = extensionDS.GetTarget(element, toBeUninstalledArc ,true);
  1034.             if (target) {
  1035.                     toBeUninstalled=target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  1036.             if (toBeUninstalled && (toBeUninstalled == "true")) {
  1037.  
  1038.                 window.removeEventListener("unload", cleanup, false);
  1039.                 var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  1040.                 var pingquery = checkSSL(getDss()) + "Ping?Version=2&Type=uninstall&client_type=SAFE&client_ver=" + getFullVersion()+"&locale="+getLocale()+"&aff_id="+getAffid();
  1041.                 var oldaffid = getAffid();
  1042.                 pref.clearUserPref("extensions.safe.build");
  1043.                 pref.clearUserPref("extensions.safe.dss");
  1044.                 pref.clearUserPref("extensions.safe.firstinstall");
  1045.                 pref.clearUserPref("extensions.safe.highlight");
  1046.                 pref.clearUserPref("extensions.safe.lastDailyPing");
  1047.                 pref.clearUserPref("extensions.safe.lastMonthlyPing");
  1048.                 pref.clearUserPref("extensions.safe.on");
  1049.                 pref.clearUserPref("extensions.safe.enablebutton");
  1050.                 pref.setBoolPref("extensions.safe.uninstalled",true);
  1051.                 pref.clearUserPref("extensions.safe.lastKnownVersion");
  1052.                                 pref.clearUserPref("extensions.safe.doSSL");
  1053.                 removeSASearch();
  1054.                                 removeInstallRegKey();
  1055.                 try {
  1056.                         var irequest = new XMLHttpRequest();
  1057.                         irequest.open("GET", pingquery, false);
  1058.                     irequest.send(null);
  1059.                 } catch(reqerr) {}
  1060.                 window.open("http://www.siteadvisor.com/ffuninstall.html?aff_id="+oldaffid);                
  1061.  
  1062.             }
  1063.         }
  1064.         break;        
  1065.         }
  1066.  
  1067.     }
  1068.     }
  1069.  
  1070. }
  1071.  
  1072. var uninstallObserver = {
  1073.   observe: function(aSubject, aTopic, aData)
  1074.   {
  1075.     try {
  1076.         item = aSubject.QueryInterface(Components.interfaces.nsIUpdateItem); 
  1077.         if (item.id != "{1650a312-02bc-40ee-977e-83f158701739}") return;
  1078.         if (aData == "item-uninstalled"){
  1079.             byebye = true;
  1080.             var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  1081.             
  1082.             var firstInstall = false;
  1083.             try{
  1084.                 firstInstall =  pref.getBoolPref("extensions.safe.firstinstall");
  1085.             } catch(ein) {}
  1086.             
  1087.             if (!firstInstall) {
  1088.                 pref.setBoolPref("extensions.safe.uninstalled",true);
  1089.                 window.open("http://www.siteadvisor.com/ffuninstall.html?aff_id="+getAffid());
  1090.             }
  1091.         }
  1092.     } catch (e) {}
  1093.   }
  1094. };
  1095.  
  1096.  
  1097. function addUninstallObserver() {
  1098.   var obs = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces["nsIObserverService"]);
  1099.   obs.addObserver(uninstallObserver, "em-action-requested", false);
  1100. }
  1101.  
  1102. function removeSASearch() {
  1103.   try{
  1104.  
  1105.     var file = Components.classes["@mozilla.org/file/directory_service;1"]
  1106.                      .getService(Components.interfaces.nsIProperties)
  1107.                      .get("ProfD", Components.interfaces.nsIFile);
  1108.     file.append("searchplugins");
  1109.     file.append("siteadvisor.src");
  1110.  
  1111.     file.remove(false);
  1112.     file = Components.classes["@mozilla.org/file/directory_service;1"]
  1113.                      .getService(Components.interfaces.nsIProperties)
  1114.                      .get("ProfD", Components.interfaces.nsIFile);
  1115.     file.append("searchplugins");
  1116.     file.append("siteadvisor.gif");
  1117.  
  1118.     file.remove(false);
  1119.   } catch (e) {
  1120.     try{
  1121.         var file = Components.classes["@mozilla.org/file/directory_service;1"]
  1122.                      .getService(Components.interfaces.nsIProperties)
  1123.                      .get("CurProcD", Components.interfaces.nsIFile);
  1124.         file.append("searchplugins");
  1125.         file.append("siteadvisor.src");
  1126.  
  1127.         file.remove(false);
  1128.         file = Components.classes["@mozilla.org/file/directory_service;1"]
  1129.                      .getService(Components.interfaces.nsIProperties)
  1130.                      .get("ProfD", Components.interfaces.nsIFile);
  1131.         file.append("searchplugins");
  1132.         file.append("siteadvisor.gif");
  1133.  
  1134.         file.remove(false);
  1135.     } catch (e2) {}
  1136.   }
  1137.  
  1138. }
  1139.  
  1140. function addSASearch() {
  1141.     var internetSearch = Components.classes["@mozilla.org/browser/internetsearch-service;1"].getService(Components.interfaces.nsIInternetSearchService); 
  1142.     internetSearch.AddSearchEngine("http://www.siteadvisor.com/download/safe/siteadvisor.src", "http://www.siteadvisor.com/download/safe/siteadvisor.gif", "","");
  1143. }
  1144.  
  1145.  
  1146. function getUninstalled() {
  1147.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  1148.     try{
  1149.         return pref.getBoolPref("extensions.safe.uninstalled");
  1150.     } catch(e) {
  1151.         return false;
  1152.     }
  1153. }
  1154.  
  1155.  
  1156.  
  1157. function checkForEmergency(xml) {
  1158.     if (alreadyWarned) return;
  1159.     var urr = xml.getElementsByTagName("UpgradeRequiredResponse");
  1160.     if (urr.length == 0) return;
  1161.     urr = urr[0].childNodes;
  1162.     for (var i = 0; i < urr.length; i++) {
  1163.         var c = urr.item(i);
  1164.         if (c.nodeName.toLowerCase() == "description") {
  1165.             alert(c.firstChild.nodeValue);
  1166.             alreadyWarned = true;
  1167.         }
  1168.  
  1169.     }
  1170. }
  1171.  
  1172. function getAffid() {
  1173.   try {
  1174.     var affid = OEMstrb("Affid");
  1175.     if (affid) return affid;
  1176.   } catch (StrBErr) {}
  1177.   return 0;
  1178. }
  1179.  
  1180. function getShowUpsellMessage() {
  1181.   try {
  1182.     var showUpsellMessage = OEMstrb("ShowSafeSearchUpsell");
  1183.     if (showUpsellMessage && showUpsellMessage.toLowerCase() == "true") return true;
  1184.     else if (showUpsellMessage && showUpsellMessage.toLowerCase() == "false") return false;
  1185.   } catch (StrBErr) {}
  1186.  
  1187.   try {
  1188.     var regKey = Components.classes["@mozilla.org/windows-registry-key;1"].createInstance(Components.interfaces.nsIWindowsRegKey);
  1189.     regKey.open(Components.interfaces.nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE, "SOFTWARE\\SiteAdvisor", Components.interfaces.nsIWindowsRegKey.ACCESS_READ);
  1190.     var hasSuite = regKey.readStringValue("HasSuite");
  1191.     if (hasSuite == "true") return false;
  1192.     else if (hasSuite == "false") return true;
  1193.   } catch(regErr) {}
  1194.   
  1195.   return true;
  1196. }
  1197.  
  1198. function getUpsellMessage() {
  1199.   try {
  1200.     var upsellMessage = OEMstrb("SafeSearchUpsellMessage");
  1201.     if (upsellMessage) return upsellMessage;
  1202.   } catch (StrBErr) {}
  1203.   return strb('safe.submitError');
  1204. }
  1205.  
  1206. function getUpsellUrl() {
  1207.   try {
  1208.     var upsellUrl = OEMstrb("SafeSearchUpsellUrl");
  1209.     if (upsellUrl) return upsellUrl;
  1210.   } catch (StrBErr) {}
  1211.   return null;
  1212. }
  1213.  
  1214. function setUpdateURL() {
  1215.     var updateON = OEMstrb('AutoUpdateFF');
  1216.     if (!updateON) updateON = "true";
  1217.     try {
  1218.     var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  1219.         if (updateON == "false")
  1220.           pref.setCharPref("extensions.{1650a312-02bc-40ee-977e-83f158701739}.updateURL","");
  1221.         else
  1222.           pref.setCharPref("extensions.{1650a312-02bc-40ee-977e-83f158701739}.updateURL","https://sadownload.mcafee.com/products/sa/firefox/update.rdf?aff_id="+getAffid());
  1223.     } catch (prefErr) {}
  1224. }
  1225.  
  1226. function strb(strKey) {
  1227.   try{
  1228.     return document.getElementById('safe-script-bundle').getString(strKey);
  1229.   } catch (bundleErr) {
  1230.     return null;
  1231.   }
  1232. }
  1233.  
  1234. function OEMstrb(strKey) {
  1235.   try {
  1236.     return OEMStrB.GetStringFromName(navigator.language+"."+strKey);
  1237.   } catch (bundleErr) {}
  1238.   try {
  1239.     return OEMStrB.GetStringFromName(navigator.language.toLowerCase()+"."+strKey);
  1240.   } catch (bundleErr) {}
  1241.   try {
  1242.     return OEMStrB.GetStringFromName(strKey);
  1243.   } catch (bundleErr) {}
  1244.   return null;
  1245. }
  1246.  
  1247. function chromeExists(p) {
  1248.   try {
  1249.     var chromeRegistry = Components.classes["@mozilla.org/chrome/chrome-registry;1"].getService(Components.interfaces.nsIChromeRegistry);
  1250.     var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  1251.     var chromeFileURI = ioService.newURI(p,"UTF-8",null);
  1252.     var localFileURI = chromeRegistry.convertChromeURL(chromeFileURI);
  1253.     if (localFileURI.spec.match(/^jar:/)) {
  1254.       var jarFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  1255.       var jarPath = localFileURI.spec.split("!")[0].replace(/jar:/,"");
  1256.       jarPath = ioService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler).getFileFromURLSpec(jarPath).path;
  1257.       jarFile.initWithPath(jarPath);
  1258.       var relPath = localFileURI.spec.split("!")[1].replace(/^\//, "");
  1259.       var zipReader = Components.classes["@mozilla.org/libjar/zip-reader;1"].createInstance(Components.interfaces.nsIZipReader);
  1260.       zipReader.init(jarFile);
  1261.       zipReader.open();
  1262.       var found = zipReader.findEntries(relPath);
  1263.       zipReader.close();
  1264.       return found?found.hasMoreElements():false;
  1265.     } else {
  1266.       var localFile = ioService.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler).getFileFromURLSpec(localFileURI.spec);
  1267.       return localFile.exists();
  1268.     }
  1269.   } catch (chromeErr) {
  1270.     return false; 
  1271.   }
  1272.  
  1273.  
  1274. }
  1275.  
  1276. var stringBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"].getService(Components.interfaces.nsIStringBundleService);
  1277. if (chromeExists("chrome://safe/content/oem.txt")) {
  1278.     OEMStrB = stringBundleService.createBundle("chrome://safe/content/oem.txt");
  1279. } else {
  1280.     OEMStrB = stringBundleService.createBundle("chrome://safe/content/default.txt");
  1281. }
  1282.  
  1283. if (!getUninstalled()) {
  1284.  
  1285. addUninstallObserver();
  1286.  
  1287. window.addEventListener("load", get_js, false);
  1288. window.addEventListener("load", pingDSS,false);
  1289. window.addEventListener("load", postInstallCheck, false);
  1290. window.addEventListener("unload", cleanup, false);
  1291.  
  1292. } else {
  1293.  
  1294. var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  1295. pref.clearUserPref("extensions.safe.uninstalled");
  1296.  
  1297. }
  1298.  
  1299. return {"getBuild": getBuild,
  1300.     "getVersion": getVersion,
  1301.         "getAffid": getAffid,
  1302.     "openSettings": openSettings,
  1303.     "domain_specifier": function() {return domain_specifier;}}
  1304.  
  1305.  
  1306. }
  1307.  
  1308. SiteAdvisorFunPack = SiteAdvisorFirefoxExtension();
  1309.  
  1310.  
  1311.